package wangxiaotao.utils;

import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;

import java.util.Collection;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * redis操作工具类
 *
 */
@Slf4j
public class RedisUtils {

    /**
     * 获得key的value
     * @param key
     * @return
     */
    public static Object get(Object key){
        if (StrUtil.isBlankIfStr(key)){
            return null;
        }
        try {
            return redisTemplate.opsForValue().get(key);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static List<Object> getObjects(Object key){
        if (StrUtil.isBlankIfStr(key)){
            return null;
        }
        try {
            Set<Object> keys = redisTemplate.keys(key);
            if (keys==null)
                return null;
            return redisTemplate.opsForValue().multiGet(keys);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


    /**
     * 加入值
     * @param key
     * @param value
     * @return
     */
    public static boolean set(Object key,Object value){
        if (StrUtil.isBlankIfStr(key)){
            log.error("redis----- set key为空，添加失败");
            return false;
        }
        try {
            redisTemplate.opsForValue().set(key,value);
            return true;
        } catch (Exception e) {
            log.error("redis----- set 添加失败");
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 加入值 和过期时间
     * @param key
     * @param value
     * @param time 单位：秒
     * @return
     */
    public static void set(Object key,Object value,long time){
        if (StrUtil.isBlankIfStr(key)){
            log.error("redis----- set key为空，添加失败");
            return;
        }
        try {
            if (time>0)
                redisTemplate.opsForValue().set(key,value,time, TimeUnit.SECONDS);
            else
                redisTemplate.opsForValue().set(key,value);
        } catch (Exception e) {
            log.error("redis----- set 添加失败");
            e.printStackTrace();
        }
    }

    /**
     * 删除key 可以输入多个
     * @param key ...string
     */
    public static void remove(Object ...key){
        if (key!=null && key.length>0){
            if (key.length==1)//只有一个
                redisTemplate.delete(key[0]);
            else
                for (Object k:key){
                    redisTemplate.delete(k);
                }
        }

    }

    /**
     * 删除key
     * @param key 集合
     */
    public static void remove(Collection key){
        redisTemplate.delete(key);
    }

//    /**
//     * 使用scan命令 查询某些前缀的key
//     * @param key
//     * @return
//     */
//    public Set<String> scan(String key){
//        return redisTemplate.execute((RedisCallback<Set<String>>) connection -> {
//
//            Set<String> binaryKeys = new HashSet<>();
//
//            Cursor<byte[]> cursor = connection.scan(new ScanOptions.ScanOptionsBuilder().match(key).count(1000).build());
//            while (cursor.hasNext()) {
//                binaryKeys.add(new String(cursor.next()));
//            }
//            return binaryKeys;
//        });
//    }
//
//    /**
//     * 使用scan命令 查询某些前缀的key 有多少个
//     * @param key
//     * @return
//     */
//    public Long scanSize(String key){
//        return redisTemplate.execute((RedisCallback<Long>)connection->{
//            long count = 0L;
//            Cursor<byte[]> cursor = connection.scan(ScanOptions.scanOptions().match(key).count(1000).build());
//            while (cursor.hasNext()) {
//                cursor.next();
//                count++;
//            }
//            return count;
//        });
//    }


    private static final RedisTemplate<Object,Object> redisTemplate = (RedisTemplate) SpringUtils.getBean("redisTemplate");
}
